package com.allm.ai.common.strategy;

import com.allm.ai.common.dto.ApiRequest;
import com.allm.ai.common.dto.StreamingOutput;
import com.allm.ai.common.entity.AiModel;

import reactor.core.publisher.Flux;

/**
 * AI模型策略接口
 * 定义了AI模型调用的统一接口，支持同步和流式调用
 */
public interface AiModelStrategy {
    
    /**
     * 同步调用API（保持向后兼容）
     * @param model AI模型配置
     * @param request API请求参数
     * @return API响应内容
     * @throws Exception 调用失败时抛出异常
     */
    String callApi(AiModel model, ApiRequest request) throws Exception;
    
    /**
     * 流式调用API（新增）
     * @param model AI模型配置
     * @param request API请求参数
     * @return 流式响应内容
     */
    default Flux<StreamingOutput> callApiStream(AiModel model, ApiRequest request) {
        // 默认实现：对于不支持流式输出的策略，返回错误
        return Flux.error(new UnsupportedOperationException(
            "当前策略不支持流式输出: " + this.getClass().getSimpleName()));
    }
    
    /**
     * 检查是否支持指定的服务提供商
     * @param serviceProvider 服务提供商名称
     * @return 是否支持
     */
    boolean supports(String serviceProvider);
    
    /**
     * 检查是否支持流式调用（可选实现）
     * @return 是否支持流式调用
     */
    default boolean supportsStreaming() {
        return false;
    }

     /**
     * 判断是否为推理模型
     */
    default boolean isReasoningModel(AiModel aiModel) {
        if (aiModel == null) return false;
        return aiModel.getReasonSupport() && aiModel.getReasoningEnable();
    }
} 